iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0
自我挑戰組

自我挑戰Ruby系列 第 25

Day 25 - 物件化區塊

  • 分享至 

  • xImage
  •  

物件化Block

之前有提起,在Ruby的世界裡Block不是物件,

也不能單獨使用,但藉由將Block物件化後,

Blcok就可以單獨存在了,

藉由Proc或Lambda可以將Block物件化。

Proc

使用Proc類別,

先藉由Proc.new變成物件形式,

再指定成變數的形式,

利用call方法呼叫,

即可以使用Blcok內的程式。

例如:

Block為 { |num| num * 3},

那我們藉由Proc.new

會變成 Proc.new { |num| num * 3},

再用指定變數的形式,

會變成triple_proc = Proc.new { |num| num * 3},

利用call方法叫出,

triple_proc.call(5),

即會得到15。

呼叫方法

其實呼叫方法的方式,

不只使用Call才能呼叫,

還有其他的方式可以呼叫方法,

例如:

triple_proc[5]

triple_proc.(5)

triple_proc === 5

triple_proc.yield 5

另外這四種方法,

都可以把剛剛物件化的Block呼叫出來。

Lambda

其實 Proc.new 就是等於lambda的概念,

Proc.new = lambda,

所以將剛剛指定變數的部分改成triple_lambda = lambda { |num| num * 3},

就可以向剛剛一樣用call呼叫我們藉由lambda做變數指定的物件化來使用。

Proc.new和lambda之間的差異

其實這兩者之間是相同的,

而唯一的差別在於,

當如果帶入多個引數時,

Proc.nw會使用第一個引數,並正常運行,

但lambda會跳出錯誤訊息,告訴你引數錯誤。

例如:

triple_proc.call(3,4,5) 會得到9

triple_lambda.call(3,4,5) 就會得到錯誤訊息

Day 25 結語

不能單獨存在的Block,

除了之前介紹使用yield,

可以讓Block運行外,

也可以藉由Proc.new或lambda將他們定義成一個變數,

在用變數內call方法來使用。


上一篇
Day 24 - 區塊2
下一篇
Day 26 - 類別與實體1
系列文
自我挑戰Ruby30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言